<?php


namespace Hilaoyu\ComputeCloudClient\Interfaces;


use Hilaoyu\ComputeCloudClient\AssetModel;
use Hilaoyu\ComputeCloudClient\AssetModels;

interface ApiVpcInterface
{
    public function getError($reArr = true, $clean = true);
    /**
     * @return array [["id"=>"regionId","name"=>"regionName"],...]
     */
    public function regionsDescribe( ):array;

    /**
     * @param string $regionId
     * @return [["id"=>"zoneId","name"=>"zoneName"],...]
     */
    public function zonesDescribe($regionId=''):array;

    /**
     * vpc详情，多个
     * @param string $vpcId
     * @param string $vpcname
     * @param string $regionId
     * @return AssetModels
     */
    public function vpcsDescribe(string $vpcId=null,string $vpcname=null,$regionId=''):AssetModels;

    /**
     * vpc详情，单个
     * @param string $vpcId
     * @param string $regionId
     * @return AssetModel|null
     */
    public function vpcDescribe(string $vpcId,$regionId=''):?AssetModel;

    /**
     * 创建vpc
     * @param null $vpcname
     * @param null $network
     * @param null $ipv6Network
     * @param string $regionId
     * @param null $resourceGroupId
     * @return AssetModel
     */
    public function vpcCreate($vpcname=null,$network=null,$ipv6Network=null,$regionId='',$resourceGroupId=null):?AssetModel;

    /**
     * 删除vpc
     * @param $vpcId
     * @param string $regionId
     * @return bool
     */
    public function vpcDelete($vpcId,$regionId=''):bool;

    /**
     * 创建交换机
     * @param $vpcId
     * @param $zoneId
     * @param $network
     * @param null $vSwitchName
     * @param null $ipv6Network
     * @param string $regionId
     * @return AssetModel|null
     */
    public function vSwitchCreate($vpcId,$zoneId,$network,$vSwitchName=null,$ipv6Network=null,$regionId=''):?AssetModel;

    /**
     * 删除交换机
     * @param $vSwitchId
     * @param string $regionId
     * @return bool
     */
    public function vSwitchDelete($vSwitchId,$regionId=''):bool;

    /**
     * 交换机详情，多个
     * @param null $vpcId
     * @param null $vSwitchId
     * @param null $vSwitchName
     * @param string $regionId
     * @return AssetModels
     */
    public function vSwitchsDescribe($vSwitchId=null,$vSwitchName=null,$vpcId=null,$regionId=''):AssetModels;

    /**
     * 交换机详情，单个
     * @param $vSwitchId
     * @param string $regionId
     * @return AssetModel|null
     */
    public function vSwitchDescribe($vSwitchId,$regionId=''):?AssetModel;

    //EIP

    /**
     * 申请弹性公网IP
     * @param int $bandwidth EIP的带宽峰值，取值范围：1~200，单位为Mbps
     * @param string $instanceChargeType EIP的计费方式，取值： PrePaid：包年包月。 PostPaid（默认值）：按量计费。; 当InstanceChargeType取值为PrePaid时，InternetChargeType必须取值PayByBandwidth；当InstanceChargeType取值为PostPaid时，InternetChargeType可取值PayByBandwidth或PayByTraffic
     * @param string $internetChargeType EIP的计量方式，取值： PayByBandwidth（默认值）：按带宽计费。 PayByTraffic：按流量计费。; 当InstanceChargeType取值为PrePaid时，InternetChargeType必须取值PayByBandwidth。;当InstanceChargeType取值为PostPaid时，InternetChargeType可取值PayByBandwidth或PayByTraffic。
     * @param string $isp 线路类型 BGP：BGP（多线）线路。BGP_PRO：BGP（多线）精品线路
     * @param string $pricingCycle 包年包月的计费周期，取值：Month（默认值）：按月付费。Year：按年付费;当InstanceChargeType参数的值为PrePaid时，该参数必选；当InstanceChargeType参数的值为PostPaid时，该参数可不填
     * @param int $period 购买时长。 当PricingCycle取值Month时，Period取值范围为1~9。  当PricingCycle取值Year时，Period取值范围为1~5。  如果InstanceChargeType参数的值为PrePaid时，该参数必选，如果InstanceChargeType参数的值为PostPaid时，该参数不填。
     * @param string $name
     * @param string $regionId
     * @param null $resourceGroupId 资源组ID
     * @return AssetModel
     */
    public function eipAddressAllocate(int $bandwidth=50,string $instanceChargeType='PostPaid',string $internetChargeType='PayByTraffic',string $isp='BGP',string $pricingCycle='',int $period=null,string $name=null, $regionId = '',$resourceGroupId=null):?AssetModel;

    public function eipAddressUpdate(string $allocationId,string $name=null,int $bandwidth=50,$regionId = ''):?AssetModel;

    /**
     * 释放弹性公网IP
     * @param string $allocationId
     * @param string $regionId
     * @return bool
     */
    public function eipAddressRelease(string $allocationId, $regionId = ''):bool;

    /**
     * 绑定弹性公网IP
     * @param string $allocationId 弹性公网IPID
     * @param string $instanceId 实例ID
     * @param string $allocationId 绑定实例类型
     * Nat：NAT网关。 SlbInstance：负载均衡SLB。 EcsInstance：云服务器ECS。 NetworkInterface：辅助弹性网卡。HaVip：高可用虚拟IP
     * @param string $regionId
     * @return bool
     */
    public function eipAddressAssociate(string $allocationId,string $instanceId,string $instanceType=null,$regionId=''):bool;

    /**
     * 解绑弹性公网IP
     * @param string $allocationId 弹性公网IPID
     * @param string $instanceId 实例ID
     * @param string $regionId
     * @return bool
     */
    public function eipAddressUnassociate(string $allocationId,string $instanceId=null,$regionId=''):bool;

    /**
     * 查询弹性IP多条
     * @param array $allocationId EIP实例的ID
     * @param string|null $eipAddress EIP的IP地址
     * @param string|null $status EIP的状态。
     * Associating：绑定中。 Unassociating：解绑中。 InUse：已分配。 Available：可用
     * @param string $regionId
     * @return AssetModels
     */
    public function eipAddressesDescribe(array $allocationId=[],string $eipAddress=null,string $status=null,$regionId=''):AssetModels;

    /**
     * 查询弹性IP 单条
     * @param string $allocationId EIP实例的ID
     * @param string $regionId
     * @return AssetModel|null
     */
    public function eipAddressDescribe(string $allocationId, string $eipAddress = null,$regionId=''):?AssetModel;
    //路由表

    /**
     * 创建路由表
     * @param $vpcId
     * @param string $routeTableName
     * @param string $regionId
     * @return AssetModel|null
     */
    public function routeTableCreate($vpcId,$routeTableName='',$regionId=''):?AssetModel;

    /**
     * 删除路由表
     * @param $routeTableId
     * @param string $regionId
     * @return bool
     */
    public function routeTableDelete($routeTableId,$regionId=''):bool;

    /**
     * 路由表详情，多个
     * @param string $routeTableId
     * @param string $vpcId
     * @param string $regionId
     * @return AssetModels
     */
    public function routeTablesDescribe(string $routeTableId=null,string $vpcId=null,$regionId=''):AssetModels;

    /**
     * 路由表详情，单个
     * @param string $routeTableId
     * @param string $regionId
     * @return AssetModel|null
     */
    public function routeTableDescribe(string $routeTableId,$regionId=''):?AssetModel;

    /**
     * 将路由表和交换机绑定
     * @param string $routeTableId
     * @param string $vSwitchId
     * @param string $regionId
     * @return mixed
     */
    public function routeTableAssociate(string $routeTableId,string $vSwitchId,$regionId='');

    /**
     * 将路由表和交换机解绑
     * @param string $routeTableId
     * @param string $vSwitchId
     * @param string $regionId
     * @return mixed
     */
    public function routeTableUnAssociate(string$routeTableId,string $vSwitchId,$regionId='');

    /**
     * 创建自定义路由条目
     * @param string $routeTableId
     * @param string $destinationNetwork
     * @param string $nextHopId
     * @param string $nextHopType  Instance（默认值）：ECS实例。
        HaVip：高可用虚拟IP。
        RouterInterface：路由器接口。
        NetworkInterface：弹性网卡。
        VpnGateway：VPN网关。
        IPv6Gateway：IPv6网关。
        NatGateway：NAT网关。
        Attachment：转发路由器
     * @param string $regionId
     * @return bool
     */
    public function routeEntryCreate(string $routeTableId,string $destinationNetwork,string $nextHopId,$nextHopType='',$regionId=''):bool;

    /**
     * 删除自定义路由条目
     * @param string $routeTableId
     * @param string|null $destinationNetwork
     * @param string $regionId
     * @return bool
     */
    public function routeEntryDelete(string $routeTableId,string $destinationNetwork=null,$regionId=''):bool;

    /**
     * @param string $routeTableId
     * @param string $regionId
     * @return array [["id"=>"RouteEntryId","destination_network"=>"destinationNetwork"],...]
     */
    public function routeEntryListDescribe(string $routeTableId,$regionId=''):array;

}
